home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2004 #9 / Amiga Plus CD - 2004 - No. 09.iso / amigaplus / tools / amigaos4_only / lights / lights.c < prev    next >
C/C++ Source or Header  |  2004-08-03  |  6KB  |  253 lines

  1. /*
  2. */
  3.  
  4. #define WWIDTH 320
  5. #define WHEIGHT 240
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <math.h>
  10.  
  11. #include <exec/types.h>
  12. #include <exec/ports.h>
  13. #include <exec/interfaces.h>
  14. #include <exec/libraries.h>
  15. #include <dos/dos.h>
  16. #include <intuition/intuition.h>
  17. #include <intuition/screens.h>
  18.  
  19. #include <proto/exec.h>
  20. #include <proto/dos.h>
  21. #include <proto/intuition.h>
  22. #include <proto/Picasso96API.h>
  23. #include <proto/graphics.h>
  24.  
  25. #define fsqr(x) pow(x,2)
  26. #define min(x,y) x<y ? x : y
  27.  
  28. // Libraries
  29. struct Library *IntuitionBase = NULL;
  30. struct Library *P96Base = NULL;
  31. struct Library *GfxBase = NULL;
  32.  
  33. // Interfaces
  34. struct IntuitionIFace *IIntuition;
  35. struct P96IFace *IP96;
  36. struct GraphicsIFace *IGraphics;
  37. struct ExecIFace *IExec;
  38. struct DOSIFace *IDOS;
  39.  
  40. struct Window *win = NULL;
  41. struct Screen *scr = NULL;
  42. struct BitMap *bm = NULL;
  43.  
  44. struct RenderInfo rinf;
  45.  
  46. int *roots;
  47.  
  48. /*
  49. ** A small routine to open a library and get its default
  50. ** interface, and report errors if anything fails.
  51. */
  52. BOOL getLibIFace( struct Library **libbase, char *libname, int version, struct Interface **ifaceptr )
  53. {
  54.   *libbase = IExec->OpenLibrary( libname, version );
  55.   if( *libbase == NULL )
  56.   {
  57.     printf( "Unable to open '%s' version %d\n", libname, version );
  58.     return FALSE;
  59.   }
  60.   *ifaceptr = IExec->GetInterface( *libbase, "main", 1, NULL );
  61.   if( *ifaceptr == NULL )
  62.   {
  63.     printf( "Unable to get the main interface for '%s'\n", libname );
  64.     return FALSE;
  65.   }
  66.   return TRUE;
  67. }
  68.  
  69. BOOL init( void )
  70. {
  71.   BPTR h;
  72.   float i;
  73.   int n;
  74.   ULONG mode;
  75.   
  76.   if( !getLibIFace( (struct Library **)&IntuitionBase, "intuition.library", 50, (struct Interface **)&IIntuition ) ) return FALSE;
  77.   if( !getLibIFace( (struct Library **)&GfxBase, "graphics.library", 48, (struct Interface **)&IGraphics ) ) return FALSE;
  78.   if( !getLibIFace( &P96Base, "Picasso96API.library", 2, (struct Interface **)&IP96 ) ) return FALSE;
  79.  
  80. /*
  81. **  mode = IP96->p96RequestModeIDTags( P96MA_MinWidth, WWIDTH,
  82. **                               P96MA_MinHeight, WHEIGHT,
  83. **                               TAG_DONE );
  84. **  if( !mode ) return FALSE;
  85. **
  86. */
  87.  
  88.   bm = IP96->p96AllocBitMap( WWIDTH, WHEIGHT, 24, 0, NULL, RGBFB_R8G8B8 );
  89.   if( !bm ) return FALSE;  
  90.  
  91.   roots = IExec->AllocVec( WWIDTH*WWIDTH*2*sizeof( int ), MEMF_ANY );
  92.   if( !roots ) return FALSE;
  93.  
  94.   for( i=0; i<WWIDTH*WWIDTH*2; i++ )
  95.   {
  96.     n = 265 - (int)sqrt( i );
  97. //    n = 10 + (int)sqrt( i );
  98.     if( n > 255 ) n = 255;
  99.     if( n < 0 ) n = 0;
  100.     roots[(int)i] = n;
  101.   }
  102.  
  103. /*
  104. **  scr = IIntuition->OpenScreenTags( NULL,
  105. **              SA_DisplayID, mode,
  106. **              SA_Depth,     24,
  107. **              SA_ShowTitle, FALSE,
  108. **              TAG_DONE );
  109. **  if( !scr ) return FALSE;
  110. **
  111. **  win = IIntuition->OpenWindowTags( NULL,
  112. **              WA_Left,         0,
  113. **              WA_Top,          0,
  114. **              WA_InnerWidth,  WWIDTH,
  115. **              WA_InnerHeight, WHEIGHT,
  116. **              WA_Backdrop,    TRUE,
  117. **              WA_Borderless,  TRUE,
  118. **              WA_CustomScreen, scr,
  119. **              WA_Activate,    TRUE,
  120. **              WA_IDCMP,       IDCMP_RAWKEY,
  121. **              TAG_DONE );
  122. **  if( !win ) return FALSE;
  123. */
  124.  
  125.   win = IIntuition->OpenWindowTags( NULL,
  126.               WA_Left,         28,
  127.               WA_Top,          28,
  128.               WA_InnerWidth,  WWIDTH,
  129.               WA_InnerHeight, WHEIGHT,
  130.               WA_Title,       "Ooooh!",
  131.               WA_ScreenTitle, "Lights by Peter Gordon (pete@shagged.org)",
  132.               WA_DragBar,     TRUE,
  133.               WA_CloseGadget, TRUE,
  134.               WA_DepthGadget, TRUE,
  135.               WA_Activate,    TRUE,
  136.               WA_IDCMP,       IDCMP_RAWKEY|IDCMP_CLOSEWINDOW,
  137.               TAG_DONE );
  138.   if( !win ) return FALSE;
  139.  
  140.   return TRUE;
  141. }
  142.  
  143. void shutdown( void )
  144. {
  145.   if( win ) IIntuition->CloseWindow( win );
  146. //  if( scr ) IIntuition->CloseScreen( scr );
  147.   if( roots ) IExec->FreeVec( roots );
  148.   if( bm ) IP96->p96FreeBitMap( bm );
  149.   if( P96Base ) IExec->CloseLibrary( P96Base );
  150.   if( GfxBase ) IExec->CloseLibrary( (struct Library *)GfxBase );
  151.   if( IntuitionBase ) IExec->CloseLibrary( (struct Library *)IntuitionBase );
  152. }
  153.  
  154. void light( int lx, int ly, int cr, int cg, int cb )
  155. {
  156.   int x,y,c,dx,dy;
  157.   UBYTE *bptr;
  158.  
  159.   bptr = (UBYTE *)rinf.Memory;
  160.  
  161.   for( y=0; y<WHEIGHT; y++ )
  162.     for( x=0; x<WWIDTH; x++ )
  163.     {
  164.       dx = lx - x;
  165.       dy = ly - y;
  166.       c = roots[dx*dx+dy*dy];
  167.       *(bptr++) = c>>cr;
  168.       *(bptr++) = c>>cg;
  169.       *(bptr++) = c>>cb;
  170.     }
  171. }
  172.  
  173. void light_mix( int lx, int ly, int cr, int cg, int cb )
  174. {
  175.   int x,y,c,dx,dy,mc;
  176.   UBYTE *bptr;
  177.  
  178.   bptr = (UBYTE *)rinf.Memory;
  179.  
  180.   for( y=0; y<WHEIGHT; y++ )
  181.     for( x=0; x<WWIDTH; x++ )
  182.     {
  183.       dx = lx - x;
  184.       dy = ly - y;
  185.       c = roots[dx*dx+dy*dy];
  186.       
  187.       mc = *bptr + (c>>cr);
  188.       if( mc > 255 ) mc = 255;
  189.       *(bptr++) = mc;
  190.       mc = *bptr + (c>>cg);
  191.       if( mc > 255 ) mc = 255;
  192.       *(bptr++) = mc;
  193.       mc = *bptr + (c>>cb);
  194.       if( mc > 255 ) mc = 255;
  195.       *(bptr++) = mc;
  196.     }
  197. }
  198.  
  199. int main( void )
  200. {
  201.   if( init() )
  202.   {
  203.     BOOL done = FALSE;
  204.     ULONG wsig, sigs, lock;
  205.     struct IntuiMessage *msg;
  206.     int x1, y1, x2, y2, x3, y3;
  207.     float c;
  208.  
  209.     wsig = (1L<<win->UserPort->mp_SigBit);
  210.  
  211.     while( !done )
  212.     {
  213.       IGraphics->WaitTOF();
  214.       IGraphics->WaitTOF();
  215.  
  216.       x1 = (int)(sin(c)*120)+160;
  217.       y1 = (int)(cos(c*2.4)*120)+120;
  218.       x2 = (int)(sin(c*3)*120)+160;
  219.       y2 = (int)(cos(-c)*120)+120;
  220.       x3 = (int)(sin(c*-2.9)*120)+160;
  221.       y3 = (int)(cos(c*1.2)*120)+120;
  222.       
  223.       c += 0.02;
  224.       
  225.       lock = IP96->p96LockBitMap( bm, (UBYTE *)&rinf, (ULONG)sizeof( struct RenderInfo ) );
  226.       if( lock )
  227.       {
  228.         light(     x1, y1, 0, 2, 2 );
  229.         light_mix( x2, y2, 2, 2, 0 );
  230.         light_mix( x3, y3, 2, 0, 2 );
  231.         
  232.         IP96->p96UnlockBitMap( bm, lock );
  233.       }
  234.  
  235.       IGraphics->BltBitMapRastPort( bm, 0, 0, win->RPort, win->BorderLeft, win->BorderTop, WWIDTH, WHEIGHT, 0x0C0 );
  236.       sigs = IExec->SetSignal( 0L, 0L );
  237.  
  238.       if( sigs & SIGBREAKF_CTRL_C ) done = TRUE;
  239.       if( sigs & wsig )
  240.       {
  241.         while( msg = (struct IntuiMessage *)IExec->GetMsg( win->UserPort ) )
  242.         {
  243.           done = TRUE;
  244.           IExec->ReplyMsg( (struct Message *)msg );
  245.         }
  246.       }
  247.     }
  248.   }
  249.  
  250.   shutdown();
  251.   return 0;
  252. }
  253.